/*
 * MainPanel.java
 *
 * Created on 23 de Janeiro de 2010, 15:17
 */
package Gui2;

import Rota.Mapa;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import javax.swing.event.MouseInputListener;

/**
 * @version 1.0
 * @author  beto - robotica
 * @version 2.0
 * @author nathy - i.a.
 */
public abstract class MainPanel extends javax.swing.JPanel implements MouseInputListener {

    private final float proporcao = 0.5f;
    private Mapa mapa = new Mapa();
//    private ArrayList<Point2D> cidades = new ArrayList<Point2D>();
//    public ArrayList<Point2D> getCidades() {
//        return cidades;
//    }
    private Point2D pontoEscolhido;
//    private GrafoVisibilidade grafo;
    private ArrayList<Line2D.Double> linhasGrafo = null;
    ArrayList<Line2D.Double> linhasMelhores = null;
    int numCidades = 0;
    int origem = 1000;
    int destino = 1000;

    public int getNumCidades() {
        return numCidades;
    }

    public MainPanel() {
        initComponents();
        this.addMouseListener(this);
    }

    abstract void mouseClicado();

    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        setBackground(new java.awt.Color(255, 255, 255));
        setPreferredSize(new java.awt.Dimension(900, 500));
        setLayout(new java.awt.BorderLayout());
    }// </editor-fold>//GEN-END:initComponents

    public void mouseClicked(MouseEvent e) {

        pontoEscolhido = new Point2D.Double(e.getPoint().x / proporcao, e.getPoint().y / proporcao);
        mapa.add(pontoEscolhido, numCidades);
        numCidades++;
        repaint();

        mouseClicado();
    }

    public Mapa getMapa() {
        return mapa;
    }

    public void setOrigem(int ori) {
        if (mapa.getMapa().size() != 0) {
            origem = ori;
            repaint();
        }
    }

    public int getDestino() {
        return destino;
    }

    public int getOrigem() {
        return origem;
    }

    public void setDestino(int dest) {
        if (mapa.getMapa().size() != 0) {
            destino = dest;
            repaint();
        }
    }

    public void reiniciarGrafo() {
        linhasGrafo = null;
        repaint();
    }

    public void reiniciarMapa() {
        origem = 1000;
        destino = 1000;
        linhasGrafo = null;
        numCidades = 0;
        mapa.clear();
        repaint();
    }

    public void defineBestPath(ArrayList<Point2D> caminho) {


        linhasMelhores = new ArrayList<Line2D.Double>();
        for (int cont = 0; cont < caminho.size() - 1; cont++) {
            Line2D.Double linha = new Line2D.Double(caminho.get(cont), caminho.get(cont + 1));
            linhasMelhores.add(linha);
        }
        repaint();
    }

    public void gerarGrafos() {
        linhasGrafo = new ArrayList<Line2D.Double>();
        for (Point2D ponto : mapa.getMapa()) {
            for (Point2D ponto2 : mapa.getMapa()) {
                if (ponto != ponto2) {
                    Line2D.Double linha = new Line2D.Double(ponto, ponto2);
                    linhasGrafo.add(linha);
                }
            }
        }
        repaint();
        mapa.mapeiaDists();
//        mapa.imprimiMatrizDist();
    }

    public void DesenhaGrade(Graphics g) {
        float distDiv = 20 * proporcao;
        int numX = (int) Math.floor(this.getWidth() / distDiv);
        int numY = (int) Math.floor(this.getHeight() / distDiv);
        g.setColor(Color.LIGHT_GRAY);
        for (int i = 1; i <= numX; i++) {
            g.drawLine((int) (i * distDiv), 0, (int) (i * distDiv), this.getHeight());
        }
        for (int i = 1; i <= numY; i++) {
            g.drawLine(0, (int) (i * distDiv), this.getWidth(), (int) (i * distDiv));
        }
    }

    public void DesenhaCidades(Graphics g) {
        for (int contAux = 0; contAux < mapa.getMapa().size(); contAux++) {
            Point2D pontos = mapa.getMapa().get(contAux);
            if (pontos != null) {
                if (origem == contAux) {
                    g.setColor(Color.BLACK);
                    g.drawString(String.valueOf("(ORIGEM)"), (int) (pontos.getX() * proporcao) + 5, (int) (pontos.getY() * proporcao) - 5);
                    g.setColor(Color.GREEN);
                } else if (destino == contAux) {
                    g.setColor(Color.BLACK);
                    g.drawString(String.valueOf("(DESTINO)"), (int) (pontos.getX() * proporcao) + 5, (int) (pontos.getY() * proporcao) - 5);
                    g.setColor(Color.RED);
                } else {
                    g.setColor(Color.BLACK);
                }
                g.fillOval((int) (pontos.getX() * proporcao) - 3, (int) (pontos.getY() * proporcao) - 3, 7, 7);
                g.setColor(Color.RED);
                g.drawString(String.valueOf(contAux), (int) (pontos.getX() * proporcao) - 4, (int) (pontos.getY() * proporcao) - 5);
            }
        }
    }

    public void DesenhaGrafo(Graphics g) {
        if (linhasGrafo != null) {
            for (Line2D.Double linha : linhasGrafo) {
//                if(linhasMelhores!=null && linhasMelhores.contains(linha)) {
//                    System.out.println("Contemmmm");
//                    g.setColor(Color.RED);
//                }
                //else  {
                // System.out.println("Nao contemm");
                g.setColor(Color.BLUE);
                // }
                g.drawLine((int) (linha.getX1() * proporcao), (int) (linha.getY1() * proporcao),
                        (int) (linha.getX2() * proporcao), (int) (linha.getY2() * proporcao));
            }
            if (linhasMelhores != null) {
                for (Line2D.Double linha : linhasMelhores) {
                    g.setColor(Color.RED);
                    g.drawLine((int) (linha.getX1() * proporcao), (int) (linha.getY1() * proporcao),
                            (int) (linha.getX2() * proporcao), (int) (linha.getY2() * proporcao));
                }
            }
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        DesenhaGrade(g);
        DesenhaGrafo(g);
        DesenhaCidades(g);
    }

    public void PontoInicial() {
    }

    public void mousePressed(MouseEvent e) {
    }

    public void mouseReleased(MouseEvent e) {
    }

    public void mouseEntered(MouseEvent e) {
    }

    public void mouseExited(MouseEvent e) {
    }

    public void mouseDragged(MouseEvent e) {
    }

    public void mouseMoved(MouseEvent e) {
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    // End of variables declaration//GEN-END:variables
}
